package com.yuandian.utils;

import cn.hutool.core.util.NumberUtil;

import java.math.RoundingMode;

/**
 * 说明：时间工具
 * @Author zfsn
 * @Date 2023/2/21 15:04
 */
public final class TimeUtil {

	/**
	 * 格式化时间
	 * @param formatType 格式化类型
	 * @param value 待格式化的时间
	 * @return 格式化后的字符串
	 */
	public static String formatTime(String formatType, Object value) {
		double val = Double.parseDouble(String.valueOf(value));
		switch (formatType) {
			// 微秒转毫秒
			case "μs to ms":
				return NumberUtil.div(val, 1_000, 2, RoundingMode.HALF_UP) + "毫秒";
			// 微秒转秒
			case "μs to s":
				return NumberUtil.div(val, 1_000_000, 2, RoundingMode.HALF_UP) + "秒";
			// 微秒转分钟
			case "μs to min":
				return NumberUtil.div(val, 60_000_000, 2, RoundingMode.HALF_UP) + "分钟";
			// 微秒转小时
			case "μs to h":
				return NumberUtil.div(val, 3_600_000_000L, 2, RoundingMode.HALF_UP) + "小时";
			// 微秒转天
			case "μs to d":
				return NumberUtil.div(val, 86_400_000_000L, 2, RoundingMode.HALF_UP) + "天";
			// 微秒转自适应
			case "μs to adapt":
				return TimeUtil.adapt(val);

			// 毫秒转秒
			case "ms to s":
				return NumberUtil.div(val, 1_000, 2, RoundingMode.HALF_UP) + "秒";
			// 毫秒转分钟
			case "ms to min":
				return NumberUtil.div(val, 60_000, 2, RoundingMode.HALF_UP) + "分钟";
			// 毫秒转小时
			case "ms to h":
				return NumberUtil.div(val, 3_600_000, 2, RoundingMode.HALF_UP) + "小时";
			// 毫秒转天
			case "ms to d":
				return NumberUtil.div(val, 86_400_000, 2, RoundingMode.HALF_UP) + "天";
			// 毫秒转自适应
			case "ms to adapt":
				return TimeUtil.adapt(val * 1_000);

			// 秒转分钟
			case "s to min":
				return NumberUtil.div(val, 60, 2, RoundingMode.HALF_UP) + "分钟";
			// 秒转小时
			case "s to h":
				return NumberUtil.div(val, 3_600, 2, RoundingMode.HALF_UP) + "小时";
			// 秒转天
			case "s to d":
				return NumberUtil.div(val, 86_400, 2, RoundingMode.HALF_UP) + "天";
			// 秒转自适应
			case "s to adapt":
				return TimeUtil.adapt(val * 1_000_000);
			default:
				return "-";
		}
	}

	/**
	 * 自适应时间格式化，保留两位小数，如:2 会在后面补上00 即2.00
	 * 1）  如果时长/耗时大于60000ms 则格式化为 “XX分XX.XX秒”保留两位小数
	 * 2）  如果时长/耗时小于60000ms大于1000ms则格式化为“XX.XX秒”保留两位小数
	 * 3）  如果时长/耗时小于1000ms则格式化为“XX.XX毫秒”保留两位小数
	 * 如:
	 * 204266ms  显示为  3分24.27秒
	 * 2008ms    显示为  2.01秒（4舍5入）
	 * 4ms       显示为  4.00毫秒（4舍5入）
	 * @param value 待格式化的时间
	 * @return 格式化后的字符串
	 */
	public static String adapt(double value) {
		double minute;
		double second;
		double millisecond;
		if (value >= 60_000_000) {
			minute = NumberUtil.div(value, 60_000_000, 0, RoundingMode.FLOOR);
			second = NumberUtil.div(value % 60_000_000, 1_000_000, 2, RoundingMode.HALF_UP);
			if (second != 0) {
				return minute + "分" + second + "秒";
			} else {
				return minute + "分";
			}
		} else if (value > 1_000_000) {
			second = NumberUtil.div(value, 1_000_000, 0, RoundingMode.FLOOR);
			millisecond = NumberUtil.div(value % 1_000_000, 1_000_000, 2, RoundingMode.HALF_UP);
			return (second + millisecond) + "秒";
		} else {
			second = NumberUtil.div(value, 1_000, 0, RoundingMode.FLOOR);
			millisecond = NumberUtil.div(value % 1_000, 1_000, 2, RoundingMode.HALF_UP);
			return (second + millisecond) + "毫秒";
		}
	}
}
